package com.smart.community.region.service;

import java.util.List;

/**
 * 数据权限服务接口
 *
 * @author Wu.Liang
 * @since 2024-12-21
 */
public interface DataScopeService {

    /**
     * 获取当前用户可访问的区域ID列表
     * @param userId 用户ID
     * @return 区域ID列表
     */
    List<Long> getAccessibleRegionIds(Long userId) throws Exception;

    /**
     * 获取当前用户可访问的社区ID列表
     * @param userId 用户ID
     * @return 社区ID列表
     */
    List<Long> getAccessibleCommunityIds(Long userId) throws Exception;

    /**
     * 获取当前用户可访问的楼栋ID列表
     * @param userId 用户ID
     * @return 楼栋ID列表
     */
    List<Long> getAccessibleBuildingIds(Long userId) throws Exception;

    /**
     * 获取当前用户可访问的单元ID列表
     * @param userId 用户ID
     * @return 单元ID列表
     */
    List<Long> getAccessibleUnitIds(Long userId) throws Exception;

    /**
     * 获取当前用户可访问的房户ID列表
     * @param userId 用户ID
     * @return 房户ID列表
     */
    List<Long> getAccessibleHouseholdIds(Long userId) throws Exception;

    /**
     * 判断用户是否有指定区域的数据权限
     * @param userId 用户ID
     * @param regionId 区域ID
     * @return 是否有权限
     */
    boolean hasRegionPermission(Long userId, Long regionId) throws Exception;

    /**
     * 判断用户是否有指定社区的数据权限
     * @param userId 用户ID
     * @param communityId 社区ID
     * @return 是否有权限
     */
    boolean hasCommunityPermission(Long userId, Long communityId) throws Exception;

    /**
     * 判断用户是否有指定楼栋的数据权限
     * @param userId 用户ID
     * @param buildingId 楼栋ID
     * @return 是否有权限
     */
    boolean hasBuildingPermission(Long userId, Long buildingId) throws Exception;

    /**
     * 判断用户是否有指定单元的数据权限
     * @param userId 用户ID
     * @param unitId 单元ID
     * @return 是否有权限
     */
    boolean hasUnitPermission(Long userId, Long unitId) throws Exception;

    /**
     * 判断用户是否有指定房户的数据权限
     * @param userId 用户ID
     * @param householdId 房户ID
     * @return 是否有权限
     */
    boolean hasHouseholdPermission(Long userId, Long householdId) throws Exception;

    /**
     * 授权用户访问指定数据范围
     * @param userId 用户ID
     * @param scopeType 数据范围类型
     * @param scopeIds 范围ID列表
     * @return 是否授权成功
     */
    boolean grantDataScope(Long userId, String scopeType, List<Long> scopeIds) throws Exception;
}
